package com.mmall.concurrency.synchronDemo;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * 其实这两个是等价的
 */
@Slf4j
public class staticFouncClass {

    // 修饰一个类 - 同步 - 作用范围
    public static void synchronClass(int j){
        synchronized (staticFouncClass.class){
            for (int i = 0; i < 10; i++){
                log.info("synchronClass{}- {}",j, i);
            }
        }
    }

    // 修饰一个方法-作用范围
    public static synchronized void staticFouncCode(int j){
        for (int i = 0; i < 10; i++){
            log.info("staticFouncCode{} - {}",j, i);
        }
    }

    // 主方法在线程池里面去执行他们
    public static void main(String[] args){
        staticFouncClass o1 = new staticFouncClass();
        staticFouncClass o2 = new staticFouncClass();

        // 创建一个线程池
        ExecutorService executorService = Executors.newCachedThreadPool();

        // 创建一个进程去执行 --这里用同一个对象的两个线程同时在线程池里同时调用这个块，同步。- 哪个对象先就那个一直执行2/1
        // 创建两个不同的对象去同时调用一个块 -- 交叉执行 --不同对象互不影响
        executorService.execute( () -> {
            o1.staticFouncCode(1);
        } );
        executorService.execute( () -> {
            //o1.staticFouncCode(2);
            o2.staticFouncCode(2);
        } );

    }

}
